/*******************************************************************
 * @Warning      : Without permission from the author,Not for commercial use
 * @File         : main.c
 * @Author       : xiaowine
 * @Date         : 2020-08-14 18:29:09
 * @version      : v01.00
 * @ **************************************************************
 * @LastEditTime : 2020-09-07 13:24:57
 * @LastEditors  : xiaowine
 * @ **************************************************************
 * @brief        : 主函数，外设和参数初始化，主循环中主要功能函数入口。
 * @Description  :
 * @FilePath     : \T5L_C51_PRJ\FUNC_HANDLER\temperature.c
 * @ **************************************************************
 * @attention    :
 * @Powered By xiaowine
 * @<h2><center>&copy;  Copyright(C) cee0.com 2020</center></h2>
 * @All rights reserved
 ******************************************************************/
#include "temperature.h"
#include "string.h"
#include "stdlib.h"
#include "timer.h"

const u16 TabNTC_10k[TempSize] = {
    32040, 30490, 29022, 27633, 26317, 25071, 23889, 22769, 21707, 20700, 19788, 18838, 17977, 17160, 16383,
    15646, 14945, 14280, 13647, 13045, 12472, 11928, 11409, 10916, 10447, 10000, 9574,  9168,  8781,  8413,
    8062,  7727,  7407,  7103,  6812,  6534,  6270,  6017,  5775,  5545,  5324,  5114,  4913,  4720,  4536,
    4360,  4192,  4031,  3877,  3730,  3572,  3454,  3324,  3201,  3082,  2968,  2859,  2755,  2654,  2558,
    2466,  2378,  2293,  2212,  2134,  2059,  1987,  1918,  1851,  1788,  1726,  1668,  1611,  1557,  1504,
    1454,  1406,  1359,  1314,  1271,  1230,  1190,  1151,  1114,  1079,  1045,  1011,  980,   949,   919,
    891,   863,   837,   811,   786,   763,   740,   718,   696,   675};
const u16 TabNTC2_10k[TempSize] = {
    32800, 31141, 29572, 28090, 26690, 25366, 24116, 22935, 21820, 20767, 19773, 18835, 17949, 17113, 16323,
    15578, 14874, 14208, 13579, 12983, 12419, 11885, 11378, 10896, 10437, 10000, 9513,  9064,  8649,  8263,
    7904,  7570,  7256,  6960,  6682,  6420,  6170,  5932,  5707,  5491,  5284,  5085,  4895,  4712,  4536,
    4367,  4204,  4047,  3896,  3750,  3610,  3475,  3346,  3221,  3101,  2987,  2876,  2771,  2670,  2573,
    2480,  2391,  2307,  2226,  2148,  2074,  2004,  1936,  1871,  1809,  1750,  1693,  1586,  1535,  1486,
    1439,  1393,  1348,  1305,  1262,  1220,  1178,  1137,  1097,  1056,  1023,  991,   960,   931,   903,
    876,   850,   825,   801,   777,   755,   733,   713,   692,   673};

// AD延时计数
u16 AD_Count = 0;
// adc采样值
u16 adc_value[3] = {0};
// ADC数值暂存
u16 adc_val[8] = {0};
//电阻值
u16 R1_value = 0;  // ADC7处NTC电阻
u16 R2_value = 0;  // ADC0处NTC电阻
//温度值
u16 R1_Temperature = 0;
u16 R2_Temperature = 0;
//温度值  由adc采用计算的处
u16 Temperature_Real     = 0;
u16 Temperatrue_Real_Old = 0;
//温度系数
short Temp_Coef[3] = {0};
//温度精度标志和温度精度
u16 Temperature_Precision = 0;
u16 Temp_Pre              = 0;
//温度上下限
u16 Temperature_Upper = 0;
u16 Temperature_Lower = 0;
//温度采样时间和次数
u16 Temp_time = 0;
u16 Temp_Freq = 0;
/*****************************************************************************
 函 数 名  : void Get_ADC_Value(void)
 功能描述  : 得到adc采样的值
 输入参数  :
 输出参数  :
 修改历史  :
  1.日    期   : 2019年4月2日
    作    者   : chengjing
    修改内容   : 创建
*****************************************************************************/
void Get_ADC_Value(void)
{
    static u16 temp[8] = {0};
    read_dgus_vp(AD_VALUE, (u8*)temp, 8);
    adc_val[0] += temp[0];
    adc_val[6] += temp[6];
    adc_val[7] += temp[7];
}

/*****************************************************************************
 函 数 名  : void Get_R_Value(void)
 功能描述  : 得到电阻值
 输入参数  :
 输出参数  :
 修改历史  :
  1.日    期   : 2019年4月2日
    作    者   : chengjing
    修改内容   : 创建
*****************************************************************************/
void Get_R_Value(u16 n)
{
    float R1_temp = 0.0, R2_temp = 0.0;
    adc_value[0] = adc_val[0] / n;
    adc_value[6] = adc_val[6] / n;
    adc_value[7] = adc_val[7] / n;
    R1_temp      = adc_value[7] * 1.0 / (adc_value[6] - adc_value[7]);
    R2_temp      = adc_value[0] * 1.0 / (adc_value[6] - adc_value[0]);
    R1_value     = R1_temp * 10000;
    R2_value     = R2_temp * 10000;
}
/*****************************************************************************
 函 数 名  : u8 FindTab(u16 *pTab,u8 Tablong,u16 dat)
 功能描述  : 二分法查表发，得到温度值，表格数据大到小
 输入参数  :	 pTab：查表指针地址		Tablong：查表长度   dat：查表的数据
 输出参数  : 返回查表的温度值
 修改历史  :
  1.日    期   : 2019年4月2日
    作    者   : chengjing
    修改内容   : 创建
*****************************************************************************/
u8 FindTab(u16* pTab, u8 Tablong, u16 dat)
{
    u8 st = 0, ed = 0, m = 0;
    u8 i = 0;
    ed   = TempSize - 1;
    if (dat >= pTab[st])
        return st;
    else if (dat <= pTab[ed])
        return ed;
    while (st < ed)
    {
        m = (st + ed) / 2;
        if (dat == pTab[m])
            break;
        if ((dat < pTab[m]) && (dat > pTab[m + 1]))
            break;
        if (dat > pTab[m])
            ed = m;
        else
            st = m;
        if (i++ > Tablong)
            break;
    }
    if (st > ed)
        return 0;
    return m;
}
/*****************************************************************************
 函 数 名  : void Get_Temperature(void)
 功能描述  : 得到温度值，经过得到AD值计算得到温度值，采用通过10次采样求平均值来计算温度
 输入参数  :	tim: 时间 n:采样次数
 输出参数  :
 修改历史  :
  1.日    期   : 2019年4月2日
    作    者   : chengjing
    修改内容   : 创建
*****************************************************************************/
void Get_Temperature(u16 tim, u16 n)
{
    static u16 i = 0, temp_t = 0;
    float temp1 = 0, temp2 = 0;
    if (!MS1msFlag)
        return;
    AD_Count++;
    if (AD_Count > tim)
    {
        Get_ADC_Value();
        i++;
        if (i >= n)
        {
            Get_R_Value(n);
            R1_Temperature = FindTab(TabNTC_10k, TempSize, R1_value);
            R2_Temperature = FindTab(TabNTC2_10k, TempSize, R2_value);
            temp1          = (TabNTC_10k[R1_Temperature] - R1_value) * 1.0 /
                    (TabNTC_10k[R1_Temperature] - TabNTC_10k[R1_Temperature + 1]);
            temp2 = (TabNTC2_10k[R2_Temperature] - R2_value) * 1.0 /
                    (TabNTC2_10k[R2_Temperature] - TabNTC2_10k[R2_Temperature + 1]);
            R1_Temperature = R1_Temperature * 10 + temp1 * 10;
            R2_Temperature = R2_Temperature * 10 + temp2 * 10;
            // write_dgus_vp(0x1002, (u8*)&R1_Temperature, 1);
            // write_dgus_vp(0x1004, (u8*)&R2_Temperature, 1);
            Temperature_Real = (R1_Temperature * Temp_Coef[0] - R2_Temperature * Temp_Coef[1] + Temp_Coef[2]);
            Temperature_Real = (Temperature_Real / (10 * Temp_Pre)) * 10;
            if (abs(Temperature_Real - Temperatrue_Real_Old) == Temp_Pre)
            {
                temp_t++;
                if (temp_t < 5)
                {
                    Temperature_Real = Temperatrue_Real_Old;
                }
                else
                {
                    temp_t               = 0;
                    Temperatrue_Real_Old = Temperature_Real;
                }
            }
            else if (abs(Temperature_Real - Temperatrue_Real_Old) >= Temp_Pre * 2)
            {
                Temperatrue_Real_Old = Temperature_Real;
                temp_t               = 0;
            }
            // Temperature_Real /= 10;
            write_dgus_vp(TEMP_CURRENT, (u8*)&Temperature_Real, 1);
            memset(adc_val, 0, sizeof(adc_val));
            i = 0;
        }
        AD_Count = 0;
    }
}
